package test1.opengl.jasonbu.com.myapplication1;

/**
 * Created by jasonbu on 2017/3/14.
 */
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import javax.microedition.khronos.opengles.GL10;

//  一个三角形包含三个顶点
public class MyTriangle {
    private FloatBuffer vertexBuffer;       // 顶点数组缓冲区
    private ByteBuffer  indexBuffer;        // 顶点索引缓冲区
    private FloatBuffer colorBuffer;        // 颜色数组缓冲区

    private float[] vertices = {        // 三角形的顶点
            0.0f,  1.0f, 0.0f,             // 0. 顶
            -1.0f, -1.0f, 0.0f,             // 1. 左下角
            1.0f, -1.0f, 0.0f              // 2. 右下角
    };

    private byte[] indices = {0, 1, 2}; // 顶点索引(逆时针方向 CCW)

    private float[] colors = {      // 每个顶点的颜色
            1.0f, 0.0f, 0.0f, 1.0f,     // 红色
            0.0f, 1.0f, 0.0f, 1.0f,     // 绿色
            0.0f, 0.0f, 1.0f, 1.0f,     // 蓝色
    };

    // 构造函数 - 设置顶点数组
    public MyTriangle(){
        // 设置顶点数组，顶点数据为浮点数据类型。一个浮点类型的数据长度为四个字节
        ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4);
        vbb.order(ByteOrder.nativeOrder()); // 使用原生字节顺序
        vertexBuffer = vbb.asFloatBuffer(); // 将字节类型缓冲区转换成浮点类型
        vertexBuffer.put(vertices);         // 将数据复制进缓冲区
        vertexBuffer.position(0);           // 定位到初始位置

        // 设置索引数组，索引数据位字节类型
        indexBuffer = ByteBuffer.allocateDirect(indices.length);
        indexBuffer.put(indices);
        indexBuffer.position(0);

        // 设置颜色数组，顶点数据为浮点数据类型。一个浮点类型的数据长度为四个字节
        ByteBuffer cbb = ByteBuffer.allocateDirect(colors.length * 4);
        cbb.order(ByteOrder.nativeOrder()); // 使用原生字节顺序
        colorBuffer = cbb.asFloatBuffer();  // 将字节类型缓冲区转换成浮点类型
        colorBuffer.put(colors);            // 将数据复制进缓冲区
        colorBuffer.position(0);            // 定位到初始位置
    }

    // 渲染三角形
    public void draw(GL10 gl) {
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);           // 使能顶点数组
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);  // 指定顶点数据缓冲区
        gl.glEnableClientState(GL10.GL_COLOR_ARRAY);            // 使能颜色数组
        gl.glColorPointer(4, GL10.GL_FLOAT, 0, colorBuffer);    // 指定颜色数据缓冲区

        // 通过索引数组绘制图元
        gl.glDrawElements(GL10.GL_TRIANGLES, indices.length, GL10.GL_UNSIGNED_BYTE, indexBuffer);
        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
    }
}